Creé un proyecto node.js llamado simpleWeb. El proyecto contiene package.json e index.js.
índice.js
const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('How are you doing'); }); app.listen(8080, () => { console.log('Listening on port 8080'); });paquete.json
{ "dependencies": { "express": "*" }, "scripts": { "start": "node index.js" } }También creé un Dockerfile para crear la imagen de la ventana acoplable para mi proyecto node.js.
Dockerfile
# Specify a base image FROM node:alpine # Install some dependencies COPY ./ ./ RUN npm install # Default command CMD ["npm", "start"]Mientras intento construir la imagen de la ventana acoplable usando "construcción de la ventana acoplable". comando que está arrojando debajo del error.
Registros de errores
simpleweb » docker build . ~/Desktop/jaypal/Docker and Kubernatise/simpleweb [+] Building 16.9s (8/8) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 37B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/node:alpine 8.7s => [auth] library/node:pull token for registry-1.docker.io 0.0s => [internal] load build context 0.0s => => transferring context: 418B 0.0s => [1/3] FROM docker.io/library/node:alpine@sha256:5b91260f78485bfd4a1614f1afa9afd59920e4c35047ed1c2b8cde4f239dd79b 0.0s => CACHED [2/3] COPY ./ ./ 0.0s => ERROR [3/3] RUN npm install 8.0s ------ > [3/3] RUN npm install: #8 7.958 npm ERR! Tracker "idealTree" already exists #8 7.969 #8 7.970 npm ERR! A complete log of this run can be found in: #8 7.970 npm ERR! **/root/.npm/_logs/2020-12-24T16_48_44_443Z-debug.log** ------ executor failed running [/bin/sh -c npm install]: exit code: 1El archivo de registro anterior proporciona una ruta "/root/.npm/_logs/2020-12-24T16_48_44_443Z-debug.log" donde puedo encontrar los registros completos.
Pero, el archivo anterior no está presente en mi máquina local.
No entiendo cuál es el problema.
Sobre la base de la respuesta de Col , también podría hacer lo siguiente en su modelo de vista:
public class IndexVM() { @AfterCompose public void doAfterCompose(@ContextParam(ContextType.COMPONENT) Component c) { Window wizard = (Window) c; Label label = (Label) c.getFellow("lblName"); .... } }Al hacerlo, en realidad tiene acceso al objeto de etiqueta y puede realizar todo tipo de tareas con él (label.setValue(), label.getValue(), etc.).
especificar el directorio de trabajo como se muestra a continuación dentro de Dockerfile funcionará:
WORKDIR '/app'asegúrese de usar --build en su comando docker-compose para compilar desde Dockerfile nuevamente:
docker-compose up --buildUn poco tarde para la fiesta, pero para los proyectos que no deseen crear un Dockerfile para el instalador, también es posible ejecutar el instalador desde un contenedor efímero . Esto brinda acceso completo a la CLI del nodo, sin tener que instalarla en la máquina host.
El comando asume que se ejecuta desde la raíz del proyecto y que hay un archivo package.json presente. La opción -v $(pwd):/app monta el directorio de trabajo actual en la carpeta /app en el contenedor, sincronizando los archivos instalados con el directorio del host. La opción -w /app establece el directorio de trabajo de la imagen como la carpeta /app. La opción --loglevel=verbose hace que la salida del comando de instalación sea detallada. Se pueden encontrar más opciones en la página oficial de Node docker hub .
docker run --rm -v $(pwd):/app -w /app node npm install --loglevel=verbosePersonalmente, uso un Makefile para almacenar varios comandos de contenedores efímeros que son más rápidos de ejecutar por separado del proceso de compilación. Pero claro, todo es posible :)
puede especificar una versión de nodo inferior a 15.
# Specify a base image FROM node:14 # Install some dependencies COPY ./ ./ RUN npm install # Default command CMD ["npm", "start"] En el caso de que desee instalar un paquete globalmente fuera del directorio de trabajo con un package.json , debe usar el indicador -g .
npm install -g <pkg> Este error puede desencadenarse si el software de CI que está utilizando, como semantic-release está integrado en el nodo e intenta instalarlo fuera de un directorio de trabajo.
También tenemos un problema similar, así que reemplacé mi npm con 'hilo', funcionó bien. Aquí está el código de ejemplo.
FROM python:3.7-alpine ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1 #install bash RUN apk --update add bash zip yaml-dev RUN apk add --update nodejs yarn build-base postgresql-dev gcc python3- dev musl-dev libffi-dev RUN yarn config set prefix ~/.yarn #install serverless RUN yarn global add serverless@2.49.0 --prefix /usr/local && \ yarn global add serverless-pseudo-parameters@2.4.0 && \ yarn global add serverless-python-requirements@4.3.0 RUN mkdir -p /code WORKDIR /code COPY requirements.txt . COPY requirements-test.txt . RUN pip install --upgrade pip RUN pip install -r requirements-test.txt COPY . . CMD ["bash"]Pruebe npm init y npm install express para crear el archivo package.json
Este problema ocurre debido a cambios en nodejs a partir de la versión 15. Cuando no se especifica WORKDIR, npm install se ejecuta en el directorio raíz del contenedor, lo que genera este error. Ejecutar la instalación de npm en un directorio de proyecto del contenedor especificado por WORKDIR resuelve el problema.
Utilice el siguiente archivo Docker:
# Specify a base image FROM node:alpine #Install some dependencies WORKDIR /usr/app COPY ./ /usr/app RUN npm install # Set up a default command CMD [ "npm","start" ]# Specify a base image FROM node:alpine WORKDIR /usr/app # Install some dependencies COPY ./package.json ./ RUN npm install COPY ./ ./ # Default command CMD ["npm","start"]1. Esto también se escribe si cambia alguno de sus archivos de índice y la compilación y la ejecución de la ventana acoplable cambian automáticamente sus nuevos cambios en la salida de su navegador
La respuesta correcta es básicamente correcta, pero cuando lo intenté, todavía no funcionó. Este es el por qué:
WORKDIR especifica el contexto de la COPY que le sigue. Habiendo ya especificado el contexto en ./usr/app , es incorrecto pedir copiar desde ./ (el directorio en el que está trabajando) a ./usr/app , ya que esto produce la siguiente estructura en el contenedor: ./usr/app/usr/app .
Como resultado CMD ["npm", "start"] , que se sigue donde lo especifica WORKDIR ( ./usr/app ), no encuentra el package.json .
Sugiero usar este Dockerfile:
FROM node:alpine WORKDIR /usr/app COPY ./ ./ RUN npm install CMD ["npm", "start"]Las soluciones anteriores no me funcionaron, cambié la imagen del nodo en mi de node:alpine a node:12.18.1 y funcionó.
Debe especificar WORKDIR antes de la instrucción COPY para garantizar la ejecución de npm install dentro del directorio donde se encuentran todos los archivos de su aplicación. Así es como puedes completar esto:
WORKDIR /usr/app # Install some dependencies COPY ./ ./ RUN npm installTenga en cuenta que simplemente puede "COPY ./ (directorio local actual) ./ (directorio contenedor que ahora es /usr/app gracias a la instrucción WORKDIR)" en lugar de "COPY ./ /usr/app"
Ahora, la buena razón para usar la instrucción WORKDIR es que evita mezclar los archivos y directorios de su aplicación con el sistema de archivos raíz del contenedor (para evitar anular los directorios del sistema de archivos en caso de que tenga etiquetas de directorios similares en los directorios de su aplicación)
Una cosa más. Es una buena práctica segmentar un poco su configuración para que cuando realice un cambio, por ejemplo, en su index.js (entonces necesita reconstruir su imagen), no necesitará ejecutar "npm install" mientras el paquete. json no ha sido modificado.
Su aplicación es muy básica, pero piense en aplicaciones grandes donde la "instalación de npm" debería llevar varios minutos.
Para hacer uso del proceso de almacenamiento en caché de Docker, puede segmentar su configuración de la siguiente manera:
WORKDIR /usr/app # Install some dependencies COPY ./package.json ./ RUN npm install COPY ./ ./Esto le indica a Docker que almacene en caché los primeros comandos COPY y RUN cuando no se toca package.json. Entonces, cuando cambia, por ejemplo, index.js y reconstruye su imagen, Docker usará el caché de las instrucciones anteriores (primero COPY y RUN) y comenzará a ejecutar el segundo COPY. Esto hace que su reconstrucción sea mucho más rápida.
Ejemplo de reconstrucción de imagen:
=> CACHED [2/5] WORKDIR /usr/app 0.0s => CACHED [3/5] COPY ./package.json ./ 0.0s => CACHED [4/5] RUN npm install 0.0s => [5/5] COPY ./ ./En el último node:alpine3.13 , basta con copiar el contenido de la carpeta raíz en la carpeta raíz del contenedor con COPY ./ ./ , mientras se omite el comando WORKDIR . Pero como solución práctica recomendaría:
WORKDIR /usr/app : es una convención entre los desarrolladores poner el proyecto en una carpeta separada
COPY ./package.json ./ - aquí copiamos solo el archivo package.json para evitar reconstrucciones desde npm
RUN npm install
COPY ./ ./ - aquí copiamos todos los archivos (recuerde crear el archivo .dockerignore en el directorio raíz para evitar copiar su carpeta node_modules)